package string;
/**
 * 演示String的常量池和不变对象特点
 */
public class StingDemo {
    public static void main(String[] args) {
        String s1 = "123abc";
        String s2 = "123abc";//重用对象
        System.out.println("s1:" + s1);
        System.out.println("s2:" + s2);
        System.out.println(s1 == s2);
        String s3 = "123abc";
        System.out.println("s3:" +s3);
        System.out.println(s1==s3);
        ////new会强制创建新对象，java不推荐这样创建字符串
        String s4 = new String("123abc");
        System.out.println("s4:" + s4);
        System.out.println(s1==s4);
        /*
            字符串拼接后产生的对象是不会存入常量池的
            下面代码触发了编译器的预编译特性:
            当编译器看到一个计算表达式时，如果在编译期间就可以确定结果时就会进行计算
            并将结果编译到字节码文件中，因此下面的代码会被编译器改为:
            String s5 = "123abc";
            因此s5会重用常量池对象
         */
        String s5 = "123" + "abc";
        System.out.println("s5:" + s5);
        System.out.println(s1==s5);

        String s = "123";
        String s6 = s + "abc";//拼接产生新对象并且不会存入常量池
        System.out.println(s1==s6);
        /*
            String是不变对象，即:字符串对象创建后内容不可改变
            若改变则会创建新对象
         */
        s1 = s1 + "!";//此时s1不再引用常量池中的对象,而是创建了一个
        System.out.println("s1" + s1);
        System.out.println(s1 == s2);//地址不再相同
        System.out.println("s2:" + s2);
        System.out.println("s3:" + s3);
    }
}
